<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>数据挖掘 | Data Mining Course</title>
    <link rel="stylesheet" href="../../css/main.css" />
    <link rel="stylesheet" href="../../css/tabs.css" />
    <script src="../../js/uikit.js"></script>
    <link href="../../css/prism.css" rel="stylesheet" />
    <script src="../../js/prism.js"></script>
  </head>

  <body>
    <div
      data-uk-sticky="animation: uk-animation-slide-top; sel-target: .uk-navbar-container; cls-active: uk-navbar-sticky; cls-inactive: uk-navbar-transparent; top: 300"
    >
      <nav class="uk-navbar-container pt-2 pb-2">
        <div class="uk-container">
          <div data-uk-navbar>
            <div class="uk-navbar-left">
              <a
                class="uk-navbar-item uk-logo uk-visible@m"
                href="../../index.html"
                >数据挖掘课程</a
              >
              <a
                class="uk-navbar-tuk-containeroggle uk-hidden@m"
                href="#offcanvas-docs"
                data-uk-toggle
                ><span data-uk-navbar-toggle-icon></span>
                <span class="uk-margin-small-left">目录</span></a
              >
              <ul class="uk-navbar-nav uk-visible@m">
                <li><a href="../index.html">文档</a></li>
              </ul>
            </div>
            <div class="uk-navbar-center uk-hidden@m">
              <a class="uk-navbar-item uk-logo" href="../../index.html"
                >数据挖掘课程</a
              >
            </div>
          </div>
        </div>
      </nav>
    </div>

    <div class="uk-section">
      <div class="uk-container">
        <div class="uk-grid-large" data-uk-grid>
          <div class="sidebar-fixed-width uk-visible@m">
            <div class="sidebar-docs uk-position-fixed uk-margin-top">
              <h5>关于这门课</h5>
              <ul class="uk-nav uk-nav-default doc-nav">
                <li><a href="../../index.html">大纲</a></li>
              </ul>
              <h5>章节</h5>
              <ul class="uk-nav uk-nav-default doc-nav">
                <li><a href="../01.html">第1章 - 数据挖掘概念</a></li>
                <li><a href="../02.html">第2章 - 分类</a></li>
                <li><a href="../03.html">第3章 - 聚类</a></li>
                <li><a href="../04.html">第4章 - 关联规则</a></li>
                <li><a href="../05.html">第5章 - 日志的挖掘与应用</a></li>
                <li><a href="../06.html">第6章 - 数据挖掘应用案例</a></li>
              </ul>
              <h5>实验课</h5>
              <ul class="uk-nav uk-nav-default doc-nav">
                <li><a href="./code-01.html">01</a></li>
                <li class="uk-active"><a href="./code-02.html">02</a></li>
                <li><a href="./code-03.html">03</a></li>
                <li><a href="./code-04.html">04</a></li>
                <li><a href="./code-05.html">05</a></li>
                <li><a href="./code-06.html">06</a></li>
                <li><a href="./code-07.html">07</a></li>
                <li><a href="./code-08.html">08</a></li>
                <li><a href="./code-09.html">09</a></li>
                <li><a href="./code-10.html">10</a></li>
                <li><a href="./code-11.html">11</a></li>
                <li><a href="./code-12.html">12</a></li>
                <li><a href="./code-13.html">13</a></li>
                <li><a href="./code-14.html">14</a></li>
                <li><a href="./code-15.html">15</a></li>
                <li><a href="./code-16.html">16</a></li>
              </ul>
            </div>
          </div>
          <div class="uk-width-1-1 uk-width-expand@m">
            <article class="uk-article">
              <h3>决策树和朴素贝叶斯</h3>
              <div class="tabs">
                <div class="tab-3">
                  <label for="tab3-1">安装包</label>
                  <input
                    id="tab3-1"
                    name="tabs-three"
                    type="radio"
                    checked="checked"
                  />
                  <div>
                    打开cmd依次运行<br />
                    <strong>pip install --user sklearn</strong>
                    <br />
                    和
                    <br />
                    <strong>pip install --user matplotlib</strong>
                    <br /><br />
                    <img src="../../images/lab02/0.JPG" alt="0" />
                    <br />
                    <br />
                    安装过程可能需要5分钟左右的时间
                  </div>
                </div>
                <div class="tab-3">
                  <label for="tab3-2">花的分类</label>
                  <input id="tab3-2" name="tabs-three" type="radio" />
                  <div>
                    第1步:
                    新建一个desicion_tree.py文件，然后按下面步骤编辑这个文件
                    <br />
                    <img src="../../images/lab02/name.JPG" alt="file-name" />
                    <br /><br />
                    第2步: 引入必要的包 sklearn 和 matplotlib
                    <br />
                    <img src="../../images/lab02/1-step-1.JPG" alt="step-1" />
                    <br /><br />
                    第3步: 导入鸢尾花卉数据集，数据集介绍在
                    <a
                      target="_blank"
                      href="https://baike.baidu.com/item/IRIS/4061453"
                      >(戳)这里</a
                    >
                    <br />
                    <img src="../../images/lab02/1-step-2.JPG" alt="step-2" />
                    <br /><br />
                    第4步: 将数据的属性和类别分别赋值给X和y
                    <br />
                    <img src="../../images/lab02/1-step-3.JPG" alt="step-3" />
                    <br />
                    每个数据的属性(X)是 花萼长度，花萼宽度，花瓣长度，花瓣宽度
                    <br />
                    比如5.1, 3.5, 1.4,
                    0.2，意思就是这朵花的花萼长度是5.1，花萼宽度是3.5，
                    花瓣长度是1.4， 花瓣宽度是0.2
                    <br />
                    数据的类别(y)有三个值，分别代表<br />
                    0: Setosa(山鸢尾), <br />
                    1: Versicolour(杂色鸢尾), <br />
                    2: Virginica(维吉尼亚鸢尾)
                    <br /><br />
                    第5步：利用算法构建模型 <br />
                    <img src="../../images/lab02/1-step-4.JPG" alt="step-4" />
                    <br /><br />
                    第6步：训练模型<br />
                    <img src="../../images/lab02/1-step-5.JPG" alt="step-5" />
                    <br />
                    <br />
                    第7步：生成决策树的图<br />
                    <img
                      src="../../images/lab02/1-step-6.JPG"
                      alt="step-6"
                    /><br /><br />

                    第8步：分类<br />
                    <img src="../../images/lab02/1-step-7.JPG" alt="step-7" />
                    <br />
                    如果最后打印出来的是0，那么它的类别是Setosa(山鸢尾),<br />
                    如果最后打印出来的是1，那么它的类别是Versicolour(杂色鸢尾),
                    <br />
                    如果最后打印出来的是2，那么它的类别是Virginica(维吉尼亚鸢尾).<br />

                    <br />
                    所有的代码应该大体上长成这个样子：
                    <br />
                    <img src="../../images/lab02/1-step-8.JPG" alt="step-8" />
                    <br /><br />
                    用python decision_tree.py去运行它<br />
                    <img src="../../images/lab02/run.JPG" alt="run" />
                    <br /><br />
                    最后，尝试更改<strong>new_flower</strong>的值，看看决策树能把新花分到哪个种类
                  </div>
                </div>
                <div class="tab-3">
                  <label for="tab3-3">敏感词检测</label>
                  <input id="tab3-3" name="tabs-three" type="radio" />
                  <div>
                    <p>第1步：创建一个bad_words_checker.py的python文件/脚本</p>
                    <p>第2步：导入包并定义数据集（是的 下面的代码可以复制粘贴了）</p>
                    <pre><code class="language-python">import numpy as np
from functools import reduce

# 定义数据集
def loadDataSet():
  postingList=[
    ['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],		
    # 这其实是对一句话的分词，这句话是"my dog has flea problems, help please!"
    # 中文：我的狗身上有跳蚤困扰，求助！
    ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],
    ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],
    ['stop', 'posting', 'stupid', 'worthless', 'garbage'],
    ['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],
    ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid'],
    ]                           #文本数据	
  classVec = [0,1,0,1,0,1]   	#类别标签向量，1代表侮辱性词汇，0代表正常词汇															
  return postingList,classVec	#返回实验样本切分的词条和类别标签向量</code></pre>
  <p>第3步：创建词汇表并根据vocabList词汇表，将inputSet向量化，向量的每个元素为1或0</p>
  <pre><code class="language-python">
#创建vocabList词汇表
def createVocabList(dataSet):
  vocabSet = set([])  					#创建一个空的不重复列表
  for document in dataSet:				
    vocabSet = vocabSet | set(document) #取并集
  return list(vocabSet)

# 根据vocabList词汇表，将inputSet向量化，向量的每个元素为1或0
def setOfWords2Vec(vocabList, inputSet):
  returnVec = [0] * len(vocabList)									#创建一个其中所含元素都为0的向量
  for word in inputSet:												#遍历每个词条
    if word in vocabList:											#如果词条存在于词汇表中，则置1
      returnVec[vocabList.index(word)] = 1
    else: print("the word: %s is not in my Vocabulary!" % word)
  return returnVec													#返回文档向量
  </code></pre>
  <p>第4步：定义朴素贝叶斯分类器训练函数</p>
  <pre><code class="language-python">
# 利用朴素贝叶斯分类器训练函数
def trainNB0(trainMatrix,trainCategory):
    numTrainDocs = len(trainMatrix)                         #计算训练的文档数目
    numWords = len(trainMatrix[0])                          #计算每篇文档的词条数
    pAbusive = sum(trainCategory)/float(numTrainDocs)       #文档属于侮辱类的概率
    p0Num = np.ones(numWords); p1Num = np.ones(numWords)    #创建numpy.ones数组,词条出现数初始化为1，拉普拉斯平滑
    p0Denom = 2.0; p1Denom = 2.0                            #分母初始化为2,拉普拉斯平滑
    for i in range(numTrainDocs):
        if trainCategory[i] == 1:                           #统计属于侮辱类的条件概率所需的数据，即P(w0|1),P(w1|1),P(w2|1)···
            p1Num += trainMatrix[i]
            p1Denom += sum(trainMatrix[i])
        else:                                               #统计属于非侮辱类的条件概率所需的数据，即P(w0|0),P(w1|0),P(w2|0)···
            p0Num += trainMatrix[i]
            p0Denom += sum(trainMatrix[i])
    p1Vect = np.log(p1Num/p1Denom)                          #取对数，防止下溢出
    p0Vect = np.log(p0Num/p0Denom)
    return p0Vect,p1Vect,pAbusive                           #返回属于侮辱类的条件概率数组，属于非侮辱类的条件概率数组，文档属于侮辱类的概率
  </code></pre>
  <p>第5步：定义朴素贝叶斯分类器分类函数</p>
  <pre><code class="language-python">
# 定义朴素贝叶斯分类器分类函数
def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
    p1 = sum(vec2Classify * p1Vec) + np.log(pClass1)        #对应元素相乘。logA * B = logA + logB，所以这里加上log(pClass1)
    p0 = sum(vec2Classify * p0Vec) + np.log(1.0 - pClass1)
    if p1 > p0:
        return 1
    else:
        return 0
  </code></pre>
  <p>第5步：定义运行朴素贝叶斯分类器的函数</p>
  <pre><code class="language-python">
# 运行朴素贝叶斯分类器
def testingNB():
  listOPosts,listClasses = loadDataSet()									#创建实验样本
  myVocabList = createVocabList(listOPosts)								#创建词汇表
  trainMat=[]
  for postinDoc in listOPosts:
    trainMat.append(setOfWords2Vec(myVocabList, postinDoc))				#将实验样本向量化
  p0V,p1V,pAb = trainNB0(np.array(trainMat),np.array(listClasses))		#训练朴素贝叶斯分类器
  testEntry = ['love', 'my', 'dalmation']									#测试样本1
  thisDoc = np.array(setOfWords2Vec(myVocabList, testEntry))				#测试样本向量化
  if classifyNB(thisDoc,p0V,p1V,pAb):
    print(testEntry,'属于侮辱类')										#执行分类并打印分类结果
  else:
    print(testEntry,'属于非侮辱类')										#执行分类并打印分类结果
  testEntry = ['stupid', 'garbage']										#测试样本2

  thisDoc = np.array(setOfWords2Vec(myVocabList, testEntry))				#测试样本向量化
  if classifyNB(thisDoc,p0V,p1V,pAb):
    print(testEntry,'属于侮辱类')										#执行分类并打印分类结果
  else:
    print(testEntry,'属于非侮辱类')	
  </code></pre>
  <p>第6步(最后一步)：添加main函数</p>
  <pre><code class="language-python">if __name__ == '__main__':
	testingNB()</code></pre>
  <p>然后cmd里运行下面代码看结果<pre><code class="language-python"></code>python bad_words_checker.py</code></pre></p>
<p>尝试更改testEntry里面的单词，比如加个"good", "wonderful""之类的词，然后运行看这套模型的分类效果。
  不过需要注意的是，如果要测试"good",就需要前面postingList里面加上带有good的句子/列表，比如</p>                  
  <img src="../../images/lab02/2-final.JPG" alt="2-final" />
  <p>这么做的原因是因为要给模型训练数据，让它知道good是正常词</p>
</div>
                </div>
              </div>
            </article>
          </div>
        </div>
      </div>
    </div>

    <div id="offcanvas-docs" data-uk-offcanvas="overlay: true">
      <div class="uk-offcanvas-bar">
        <button class="uk-offcanvas-close" type="button" data-uk-close></button>
        <h5 class="uk-margin-top">关于这门课</h5>
        <ul class="uk-nav uk-nav-default doc-nav">
          <li><a href="../indext.html">大纲</a></li>
        </ul>
        <h5 class="uk-margin-top">章节</h5>
        <ul class="uk-nav uk-nav-default doc-nav">
          <li><a href="../01.html">第1章 - 数据挖掘概念</a></li>
          <li><a href="../02.html">第2章 - 分类</a></li>
          <li><a href="../03.html">第3章 - 聚类</a></li>
          <li><a href="../04.html">第4章 - 关联规则</a></li>
          <li><a href="../05.html">第5章 - 日志的挖掘与应用</a></li>
          <li><a href="../06.html">第6章 - 数据挖掘应用案例</a></li>
        </ul>
        <h5>实验课</h5>
        <ul class="uk-nav uk-nav-default doc-nav">
          <li><a href="./code-01.html">01</a></li>
          <li class="uk-active"><a href="./code-02.html">02</a></li>
          <li><a href="./code-03.html">03</a></li>
          <li><a href="./code-04.html">04</a></li>
          <li><a href="./code-05.html">05</a></li>
          <li><a href="./code-06.html">06</a></li>
          <li><a href="./code-07.html">07</a></li>
          <li><a href="./code-08.html">08</a></li>
          <li><a href="./code-09.html">09</a></li>
          <li><a href="./code-10.html">10</a></li>
          <li><a href="./code-11.html">11</a></li>
          <li><a href="./code-12.html">12</a></li>
          <li><a href="./code-13.html">13</a></li>
          <li><a href="./code-14.html">14</a></li>
          <li><a href="./code-15.html">15</a></li>
          <li><a href="./code-16.html">16</a></li>
        </ul>
      </div>
    </div>

    <footer class="uk-section uk-text-center uk-text-muted">
      <div class="uk-container uk-container-small">
        <div class="uk-margin-medium"></div>
      </div>
    </footer>

    <script src="../js/awesomplete.js"></script>
    <script src="../js/custom.js"></script>
  </body>
</html>
